﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Security.Cryptography;
using System.Text;
using System.Diagnostics;
using Microsoft.Security.Application;
using System.Data.SqlClient;
using System.Data;
using System.Globalization;

#pragma warning disable 0618 // disable AntiXX is obsolete warning

public partial class GebruikerWijzigen : System.Web.UI.Page
{
    
    private Persoon p;
    private ConnectDB db;
    private SqlDataReader reader;
    private SqlCommand cmd;

    protected void Page_Load(object sender, EventArgs e)
    {
        // Controleer of gebruiker is ingelogd
        if (!IsPostBack)
        {
            if (Request.Cookies["InHollandAir"] != null)
                fillBoxes();
            else
                Response.Redirect("Login.aspx");
        }
    }

    // get Data from database
    private void fillBoxes()
    {
        try
        {
            string sessionid = Request.Cookies["InHollandAir"]["1"];
            if (ConnectDB._Connection.State == ConnectionState.Open)
                ConnectDB._Connection.Close();
            ConnectDB._Connection.Open();
            cmd = new SqlCommand(sp.getKlantGegevens, ConnectDB._Connection);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter session = cmd.Parameters.Add("@sessionid", SqlDbType.VarChar);

            session.Value = sessionid;
            reader = cmd.ExecuteReader();
            printKlantGegevens();
        }

        catch (SqlException e)
        {
            lbl_foutmelding.Text = Fout.databaseOffline;
            LogError.writeToLogFile(e.Message);
        }
        finally
        {
            reader.Close();
            ConnectDB._Connection.Close();
        }
    }

    private void printKlantGegevens()
    {
        // Use data from database to fill in the forms using html encoding
        while (reader.Read())
        {
            txt_voornaam.Text = AntiXss.HtmlEncode(reader["Voornaam"].ToString());
            if (reader["Tussenvoegsel"] != null)
                txt_tussenvoegsel.Text = AntiXss.HtmlEncode(reader["Tussenvoegsel"].ToString());
            txt_achternaam.Text = AntiXss.HtmlEncode(reader["Achternaam"].ToString());
            txt_straat.Text = AntiXss.HtmlEncode(reader["Straatnaam"].ToString());
            txt_huisnummer.Text = AntiXss.HtmlEncode(reader["Huisnummer"].ToString().Trim());
            txt_postcode.Text = AntiXss.HtmlEncode(reader["Postcode"].ToString());
            txt_plaats.Text = AntiXss.HtmlEncode(reader["Plaats"].ToString());
            txt_telefoon.Text = AntiXss.HtmlEncode(reader["Telefoonnummer"].ToString());
            txt_email.Text = AntiXss.HtmlEncode(reader["Emailadres"].ToString());
            if (reader["Geslacht"].ToString() == "v")
                dd_geslacht.SelectedValue = "Vrouw";
            else
                dd_geslacht.SelectedValue = "Man";
            dd_vraag.SelectedValue = reader["Vraag"].ToString();

            // string to datetime parser
            DateTime parsedGeboortedatum;
            string geboorteDatum = reader["Geboortedatum"].ToString().Trim();
            if (DateTime.TryParseExact(geboorteDatum, "dd'-'MM'-'yyyy",
                CultureInfo.CurrentCulture, DateTimeStyles.None, out parsedGeboortedatum))
            {
                dd_dag.SelectedIndex = parsedGeboortedatum.Day - 1;
                dd_maand.SelectedIndex = parsedGeboortedatum.Month - 1;
                dd_jaar.SelectedValue = parsedGeboortedatum.Year.ToString();
            }
            Session["KlantId"] = int.Parse(reader["Klantnummer"].ToString());
            Session["Email"] = reader["Emailadres"].ToString();
        }

       
    }


    protected void btn_wijzig_account_Click(object sender, EventArgs e)
    {
       wijzigPersoon();
    }

    public void wijzigPersoon()
    {
        // Validate if the email adress does not yet exist or is the same
        bool emailBestaat = validateEmail();
        // Collect data from the forms and insert them in a persoon object, write persoon to database where klant id = klant id.
        p = new Persoon();
        p.Voornaam = txt_voornaam.Text.Trim();
        if (txt_tussenvoegsel.Text.Trim() != null) p.TussenVoegsel = txt_tussenvoegsel.Text;
        p.Achternaam = txt_achternaam.Text.Trim();
        if (dd_geslacht.SelectedValue == "Man") p.Geslacht = "m";
        else if (dd_geslacht.SelectedValue == "Vrouw") p.Geslacht = "v";
        else p.Geslacht = "o";
        p.GeboorteDatum = dd_dag.Text.Trim() + "-" + dd_maand.Text.Trim() + "-" + dd_jaar.Text.Trim();
        p.TelefoonNummer = txt_telefoon.Text.Trim();
        if (!emailBestaat)
        {
            lbl_foutmelding.Text = "";
            p.EMailAdres = txt_email.Text.Trim().ToLower();
        }
        p.Postcode = txt_postcode.Text.Trim();
        p.Plaats = txt_plaats.Text.Trim();
        p.StraatNaam = txt_straat.Text.Trim();
        p.Huisnummer = txt_huisnummer.Text.Trim();
        p.Vraag = dd_vraag.SelectedItem.Text;
        p.Antwoord = txt_antwoord.Text.ToLower().Trim();
        p.KlantId = (int) Session["KlantId"];
   
        // De nieuwe persoon wordt weggeschreven naar de database, gebruiker wordt
        // doorgestuurd naar een inlogscherm.
        if (!emailBestaat)
        {
            db = new ConnectDB();
            db.persoonWijzig(sp.setWijzigKlant, p);
            Response.Redirect("GebruikerOverzicht.aspx");
        }
        else
            lbl_foutmelding.Text = Fout.emailBestaat;
        
    }

    private bool validateEmail()
    {
        bool result = false;
        if (Session["Email"].ToString() == txt_email.Text)
            result = false;
        else
        {
            try
            {
                ConnectDB._Connection.Open();
                cmd = new SqlCommand(sp.getPersoonFromEmail, ConnectDB._Connection);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlParameter eMail = cmd.Parameters.Add("@Emailadres", SqlDbType.VarChar);
                eMail.Value = txt_email.Text.Trim().ToLower();
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    if (reader["Emailadres"].ToString() == txt_email.Text)
                        result = true;
                }
            }
            catch (SqlException e)
            {
                lbl_foutmelding.Text = Fout.databaseOffline;
                LogError.writeToLogFile(e.Message);
            }
            finally
            {
                reader.Close();
                ConnectDB._Connection.Close();
            }
        }
        return result;
    }
}